POJ 2155 Matrix (二维树状数组)
Matrix
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 17224 | Accepted: 6460 |
Description
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N).
We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.
1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].
We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions.
1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2).
2. Q x y (1 <= x, y <= n) querys A[x, y].
Input
The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case.
The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.
The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above.
Output
For each querying output one line, which has an integer representing A[x, y].
There is a blank line between every two continuous test cases.
There is a blank line between every two continuous test cases.
Sample Input
1 2 10 C 2 1 2 2 Q 2 2 C 2 1 2 1 Q 1 1 C 1 1 2 1 C 1 2 1 2 C 1 1 2 2 Q 1 1 C 1 1 2 1 Q 2 1
Sample Output
1 0 0 1
很裸的题。
可以使用二维树状数组。
二维的写起来很方便,两重循环。
如果是要修改(x1,y1) - (x2,y2)的矩形区域。
那么可以在(x1,y1) 出加1,在(x2+1,y1)处加1,在(x1,y2+1)处加1,在(x2+1,y2+1)处加1 。。
画个图就知道了,查询单点就是求和。
1 /* *********************************************** 2 Author :kuangbin 3 Created Time :2014/5/23 22:34:04 4 File Name :E:\2014ACM\专题学习\数据结构\二维树状数组\POJ2155.cpp 5 ************************************************ */ 6 7 #include <stdio.h> 8 #include <string.h> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <math.h> 17 #include <stdlib.h> 18 #include <time.h> 19 using namespace std; 20 const int MAXN = 1010; 21 int lowbit(int x) 22 { 23 return x&(-x); 24 } 25 int c[MAXN][MAXN]; 26 int n; 27 int sum(int x,int y) 28 { 29 int ret = 0; 30 for(int i = x;i > 0;i -= lowbit(i)) 31 for(int j = y;j > 0;j -= lowbit(j)) 32 ret += c[i][j]; 33 return ret; 34 } 35 void add(int x,int y,int val) 36 { 37 for(int i = x;i <= n;i += lowbit(i)) 38 for(int j = y;j <= n;j += lowbit(j)) 39 c[i][j] += val; 40 } 41 42 int main() 43 { 44 //freopen("in.txt","r",stdin); 45 //freopen("out.txt","w",stdout); 46 int T; 47 scanf("%d",&T); 48 while(T--) 49 { 50 int q; 51 scanf("%d%d",&n,&q); 52 memset(c,0,sizeof(c)); 53 char op[10]; 54 int x1,y1,x2,y2; 55 while(q--) 56 { 57 scanf("%s",op); 58 if(op[0] == 'C') 59 { 60 scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 61 add(x1,y1,1); 62 add(x2+1,y1,1); 63 add(x1,y2+1,1); 64 add(x2+1,y2+1,1); 65 } 66 else 67 { 68 scanf("%d%d",&x1,&y1); 69 if(sum(x1,y1)%2 == 0)printf("0\n"); 70 else printf("1\n"); 71 } 72 } 73 if(T > 0)printf("\n"); 74 } 75 return 0; 76 }
人一我百!人十我万!永不放弃~~~怀着自信的心,去追逐梦想